package com.mccken.practice.top100.Top_1$20.Top_25;

import com.mccken.practice.top100.ListNode;
import com.mccken.practice.top100.ListNodeUtil;

/**
 * @program: mccken-collect
 * @description:
 * @author: mccken
 * @create: 2024-02-14 19:59
 **/
public class AddTwoNumbers {

	public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		ListNode prvNode = new ListNode(-1);
		ListNode node = prvNode;
		addTwoNumbers(l1, l2, node, 0);
		return prvNode.next;
	}

//	public ListNode addTwoNumbers_(ListNode l1, ListNode l2, ListNode node, int addNum) {
//		if (l1 == null && l2 == null) {
//			if (addNum == 0) {
//				return null;
//			} else {
//				node.next = new ListNode(1);
//				return node.next;
//			}
//		}
//
//		int val1 = 0;
//		ListNode l1_next = null;
//		if (l1 != null) {
//			val1 = l1.val;
//			l1_next = l1.next;
//		}
//
//		int val2 = 0;
//		ListNode l2_next = null;
//		if (l2 != null) {
//			val2 = l2.val;
//			l2_next = l2.next;
//		}
//
//		int value = val1 + val2 + addNum;
//		if (value < 10) {
//			// 本次递归动作	
//			node.next = new ListNode(value);
//			// 上次递归结果
//			addTwoNumbers(l1_next, l2_next, node.next, 0);
//		} else {
//			int mod = value % 10;
//			node.next = new ListNode(mod);
//			addTwoNumbers(l1_next, l2_next, node.next, 1);
//		}
//	}

	public void addTwoNumbers(ListNode l1, ListNode l2, ListNode node, int addNum) {
		if (l1 == null && l2 == null) {
			if (addNum == 0) {
			} else {
				node.next = new ListNode(1);
			}
			return;
		}

		int val1 = 0;
		ListNode l1_next = null;
		if (l1 != null) {
			val1 = l1.val;
			l1_next = l1.next;
		}

		int val2 = 0;
		ListNode l2_next = null;
		if (l2 != null) {
			val2 = l2.val;
			l2_next = l2.next;
		}

		int value = val1 + val2 + addNum;
		if (value < 10) {
			// 本次递归动作	
			node.next = new ListNode(value);
			// 上次递归结果
			addTwoNumbers(l1_next, l2_next, node.next, 0);
		} else {
			int mod = value % 10;
			node.next = new ListNode(mod);
			addTwoNumbers(l1_next, l2_next, node.next, 1);
		}
	}

	public static void main(String[] args) {
		ListNode l1 = ListNodeUtil.buildListNode(new int[]{1, 9, 9, 9, 9, 9, 9, 9, 9, 9});
		ListNode l2 = ListNodeUtil.buildListNode(new int[]{9});
//		ListNode l1 = ListNodeUtil.buildListNode(new int[]{2,4,3,6});
//		ListNode l2 = ListNodeUtil.buildListNode(new int[]{5,6,4});

		ListNodeUtil.printListNode(l1);
		ListNodeUtil.printListNode(l2);
		AddTwoNumbers demo = new AddTwoNumbers();
		ListNode listNode = demo.addTwoNumbers(l1, l2);
		System.out.println();
		ListNodeUtil.printListNode(listNode);
	}
}
